#include "mmu.h"

  # vectors.S sends all traps here.
.globl alltraps
alltraps:             # 公共入口，以TF中的trapno互相区分
  # Build trap frame.
  pushl %ds
  pushl %es
  pushl %fs
  pushl %gs
  pushal      # 涉及eax，ebx，ecx，edx，esp，ebp，esi，edi
  
  # Set up data and per-cpu segments.
  movw $(SEG_KDATA<<3), %ax   # ds和es都使用内核数据段SEG_KDATA
  movw %ax, %ds
  movw %ax, %es
  movw $(SEG_KCPU<<3), %ax    # fs和gs都使用per-CPU段SEG_KCPU
  movw %ax, %fs
  movw %ax, %gs

  # Call trap(tf), where tf=%esp
  pushl %esp      # 堆栈传递的参数trapframe起点，给trap()
  call trap       # （C语言）公共入口trap()
  addl $4, %esp   # 从“call trap”返回，丢弃刚才传给trap的参数

  # Return falls through to trapret...
.globl trapret
trapret:          # 公共返回的代码，无论中断、系统调用都一样
  popal
  popl %gs
  popl %fs
  popl %es
  popl %ds
  addl $0x8, %esp  # trapno and errcode   # 已经撤销全部的trapframe
  iret  # 如果中断返回到用户态断点，将伴随用户态栈切换
